home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Megahits 5
/
Megahits 5 (1994)(GTI - Rhein-Main-Soft)(DE)(Disc 2 of 2)[!].iso
/
archive
/
print
/
virtprinters2.lha
/
iff_printer_source
/
render.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-06-27
|
5KB
|
147 lines
/****************************************************************************
*
* IFF_Printer driver.
*/
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/memory.h>
#include <devices/prtbase.h>
#include <devices/printer.h>
#include <iffp/packer.h>
#include <clib/exec_protos.h>
#include "task.h"
extern struct Library *AbsExecBase;
extern struct PrinterData *PD;
extern struct PrinterExtendedData *PED;
extern void SetDensity(ULONG);
extern void Transfer(struct PrtInfo *PInfo, UWORD y, BYTE *ptr, UWORD colors[]);
extern int SendMyMsg(int i);
#define MAXCOLORBUFS 3
void Eject(void);
BYTE *PackBuf;
UWORD BufSize, ColorSize;
UBYTE *ptr;
UWORD colors[MAXCOLORBUFS];
int Render(long ct, long x, long y, long status)
{
int i, err;
err=PDERR_NOERR;
switch(status) {
case 0 : /* Master Initialization */
/*
ct - pointer to IODRPReq structure.
x - width of printed picture in pixels.
y - height of printed picture in pixels.
*/
BufSize = ((PED->ped_MaxXDots + 15) / 16) * 2;
ColorSize = BufSize;
if (PD->pd_Preferences.PrintShade == SHADE_COLOR)
BufSize *= 3;
colors[0] = ColorSize * 0; /* Black or yellow */
colors[1] = ColorSize * 1; /* Magenta */
colors[2] = ColorSize * 2; /* Cyan */
PD->pd_PrintBuf = AllocMem(BufSize, MEMF_ANY);
if (PD->pd_PrintBuf == NULL) {
err = PDERR_BUFFERMEMORY; /* no mem */
}
else {
PackBuf = AllocMem(MaxPackedSize(BufSize),
MEMF_ANY);
if (PackBuf == NULL) {
err = PDERR_BUFFERMEMORY;
FreeMem(PD->pd_PrintBuf, BufSize);
PD->pd_PrintBuf = NULL;
}
else if (SendMyMsg(myCode_OpenFile)
== NULL) err = PDERR_BUFFERMEMORY;
}
break;
case 1 : /* Scale, Dither and Render */
/*
ct - pointer to PrtInfo structure.
x - 0.
y - row # (0 to Height - 1).
*/
Transfer((struct PrtInfo *)ct, y, PD->pd_PrintBuf,
colors);
err = PDERR_NOERR; /* all ok */
break;
case 2 : /* Dump Buffer to Printer */
/*
ct - 0.
x - 0.
y - # of rows sent (1 to NumRows).
*/
if (SendMyMsg(myCode_WriteLine) == NULL) {
err = PDERR_CANCEL;
}
break;
case 3 : /* Clear and Init Buffer */
/*
ct - 0.
x - 0.
y - 0.
*/
ptr = PD->pd_PrintBuf;
i = BufSize;
do {
*ptr++ = 0;
} while (--i);
break;
case 4 : /* Close Down */
/*
ct - error code.
x - io_Special flag from IODRPReq struct
y - 0.
*/
err = PDERR_NOERR; /* assume all ok */
/* if user did not cancel the print */
if (ct != PDERR_CANCEL) {
/* if want to unload paper */
if (!(x & SPECIAL_NOFORMFEED)) {
/* eject paper */
Eject();
}
}
if (PD->pd_PrintBuf != NULL) {
FreeMem(PD->pd_PrintBuf, BufSize);
}
if (PackBuf != NULL) {
FreeMem(PackBuf, MaxPackedSize(BufSize));
PackBuf = NULL;
}
break;
case 5 : /* Pre-Master Initialization */
/*
ct - 0 or pointer to IODRPReq structure.
x - io_Special flag from IODRPReq struct
y - 0.
*/
/* select density */
SetDensity(x & SPECIAL_DENSITYMASK);
break;
}
return(err);
}
void Eject(void) {
SendMyMsg(myCode_CloseFile);
}